// filename: frontend/src/utils/request.js

import { useAuthStore } from '@/store/auth';

let isRefreshing = false;
let requestQueue = [];

const API_BASE_URL = import.meta.env.VITE_API_BASE_URL;

export const request = (options) => {
  const authStore = useAuthStore();
  
  return new Promise((resolve, reject) => {
    
    const config = {
      ...options,
      url: `${API_BASE_URL}${options.url}`,
      header: {
        ...options.header,
      },
      // 【核心修改1】如果 options 中传入了 responseType，就使用它
      responseType: options.responseType || 'json',

      success: (res) => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 【核心修改2】根据 responseType 决定 resolve 的内容
          // 如果是 arraybuffer，直接返回原始的 res.data
          if (options.responseType === 'arraybuffer') {
            resolve(res.data);
          } else {
            // 否则，对于 json，我们继续返回解析后的 data
            // （uni-app 会自动解析，即使 responseType 未显式设置为 'json'）
            resolve(res.data);
          }
          return;
        }

        if (res.statusCode === 401 && !options.url.includes('/api/refresh')) {
          
          if (!isRefreshing) {
            isRefreshing = true;
            authStore.refreshToken()
              .then(newAccessToken => {
                requestQueue.forEach(callback => callback(newAccessToken));
                requestQueue = [];
                
                request({ ...options }).then(resolve).catch(reject);
              })
              .catch(err => {
                requestQueue.forEach(callback => callback(null, err));
                requestQueue = [];
                reject(err);
              })
              .finally(() => {
                isRefreshing = false;
              });

          } else {
            requestQueue.push((newAccessToken, err) => {
              if (err) {
                reject(err);
              } else {
                request({ ...options }).then(resolve).catch(reject);
              }
            });
          }
          return;
        }
        
        // 其他错误，reject 整个 res 对象，以便上层能获取更多信息
        reject(res);
      },
      fail: (err) => {
        reject(err);
      }
    };

    if (authStore.isLoggedIn && authStore.access_token) {
      config.header['Authorization'] = `Bearer ${authStore.access_token}`;
    }

    uni.request(config);
  });
};